home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
swag
/
savescrn.swg
/
0014_Fully Compatible Screen Saving.pas
< prev
Wrap
Pascal/Delphi Source File
|
1994-11-30
|
3KB
|
84 lines
{
> Can anyone tell me (or give me the source code) how I can grab
> a screen in textmode and put it later back on the screen.
If you want your software to be compatible, use the following procedures,
functions and structs:
}
const
MaxScr=25;
type
ScrRec=record Ptr:pointer; Size:word; end;
ScrType=array[1..MaxScr] of ScrRec; { Pointers to saved screens }
var
Screen:ScrType;
ScrCtr:byte; { Index to saved screen }
v_vidseg:word; { Segmentaddress of video-RAM }
v_pageinmem:boolean; { screenpage saved in memory }
{ current number of rows }
function rows:byte;
var tmp:byte;
begin
tmp:=mem[$40:$84]+1;
if tmp<25 then rows:=25 else rows:=tmp;
end;
{ current number of columns }
function cols:byte;
var tmp:byte;
begin
tmp:=mem[$40:$4a];
if tmp<80 then cols:=80 else cols:=tmp;
end;
{ save screen }
procedure setscr;
begin
Screen[ScrCtr].Size:=Rows*Cols*2;
getmem(Screen[ScrCtr].Ptr,Screen[ScrCtr].Size);
move(mem[v_vidseg:0],Screen[ScrCtr].Ptr^,Screen[ScrCtr].Size);
inc(ScrCtr);
v_pageinmem:=true;
end;
{ restore last screen }
procedure getscr;
begin
if ScrCtr>1 then begin
dec(ScrCtr);
move(Screen[ScrCtr].Ptr^,mem[v_vidSeg:0],Screen[ScrCtr].Size);
freemem(Screen[ScrCtr].Ptr,Screen[ScrCtr].Size);
end else v_pageinmem:=false;
end;
{ determine video-segment: }
begin
Regs.ah:=15; { Define actual video-mode }
intr($10,Regs); { Call BIOS video-interrupt }
if Regs.al=7 then v_vidseg:=$b000 { Monochrome mode? }
else v_vidseg:=$b800; { No, Colormode }
v_pageinmem:=false;
end.
{
If you want to create louzy software, which is not compatible at all, use an
array like:
vidmem:array[1..25,1..80] of record ch:char; attr:byte; end; absolute
$b800:0000;
This array will _ONLY_ work in color-mode on a 25x80 screen. The above
procedures work in _EVERY_ (!) text-mode.
If you've setup everything correctly (just do the determine-stuff), then you
can save a screen by using 'setscr', and restore the screen by 'getscr'. Those
two must be in balance. If you placed some windows on the screen (and saved all
the screens), and an error accurs, you can clear the memory by something like:
while v_pageinmem do getscr;
MaxScr is not the number of lines (25), but the maximum number of screens which
can be saved. If you need more or less, set it to something appropriate, but
use some slack: the structs hardly cost memory (especialy if you compare it
with the array-type). _ _
}